package com.job.admin.job.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.job.admin.job.enmus.RegistryConfig;
import com.job.admin.job.schedule.JobDynamicScheduler;
import com.job.admin.jobregister.model.JobRegisterModel;

/**
 * 
 * @Title: JobRegistryMonitorHelper.java
 * @Package: com.job.admin.job.thread
 * @Description: job注册服务
 * @author: sunwei
 * @date: 2017年8月6日 上午11:41:48
 * @version: V1.0
 */
public class JobRegistryMonitorHelper {
	private static Logger logger = LoggerFactory.getLogger(JobRegistryMonitorHelper.class);
	private static JobRegistryMonitorHelper instance = new JobRegistryMonitorHelper();
	public static JobRegistryMonitorHelper getInstance(){
		return instance;
	}
	private ConcurrentHashMap<String, List<String>> registMap = new ConcurrentHashMap<String, List<String>>();

	private Thread registryThread;
	private boolean toStop = false;
	public void start(){
	    registryThread = new Thread(new Runnable() {
		@Override
		public void run() {
			while (!toStop) {
				try {
                                        // remove dead admin/executor
                			JobDynamicScheduler.jobRegisterDao.deleteDead(RegistryConfig.DEAD_TIMEOUT);
                			// fresh registry map
                			ConcurrentHashMap<String, List<String>> temp = new ConcurrentHashMap<String, List<String>>();
					List<JobRegisterModel> list = JobDynamicScheduler.jobRegisterDao.findAll(RegistryConfig.DEAD_TIMEOUT);
					if (list != null) {
						for (JobRegisterModel item: list) {
							String groupKey = makeGroupKey(item.getRegistryGroup(), item.getRegistryKey());
							List<String> registryList = temp.get(groupKey);
							if (null==registryList) {
								registryList = new ArrayList<String>();
							}
							registryList.add(item.getRegistryValue());
							temp.put(groupKey, registryList);
						}
					}
						registMap = temp;
					} catch (Exception e) {
						logger.error("job registry instance error:{}", e);
					}
					try {
						TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
					} catch (InterruptedException e) {
						logger.error("job registry instance error:{}", e);
					}
				}
			}
		});
		registryThread.setDaemon(true);
		registryThread.start();
	}

	public void toStop(){
		toStop = true;
		//registryThread.interrupt();
	}

	private static String makeGroupKey(String registryGroup, String registryKey){
		return registryGroup.concat("_").concat(registryKey);
	}
	
	public static List<String> discover(String registryGroup, String registryKey){
		String groupKey = makeGroupKey(registryGroup, registryKey);
		return instance.registMap.get(groupKey);
	}
	
}
